const express = require('express')
const md5 = require('md5')
const multer = require('multer')
const model = require('./model/chat')
const path = require('path')
const app = express()
const server = require('http').createServer(app)
const io = require('socket.io')(server);
server.listen(3000, '127.0.0.1')

// const uploader = multer({dest:path.join(__dirname, './www/uploads')})

const uploader = multer({
  // 存储 上传成功后，图片存储在服务器中的位置
  storage: multer.diskStorage({
    // 路径
    destination: function (req, file, cb) {
      cb(null, path.join(__dirname, './www/uploads'));
    },
    // 文件名
    filename: function (req, file, cb) {
      var changedName = (new Date().getTime()) + '-' + file.originalname;
      cb(null, changedName);
    }
  })
})

app.use(express.static('www'))


// 文件上传
app.post('/upfile', uploader.single('file'), (req, res) => {
  res.send({ url: '/uploads/' + req.file.filename })
})

// 在线人
let onlineUser = {}

// 监听socketio发过来的事件
io.on('connection', socket => {
  let uname = '未知'
  // 接受用户名称
  socket.on('uname', async nickname => {
    uname = nickname;
    // 添加到在线队列中
    onlineUser[md5(uname)] = socket;

    // 查询当前数据库中最新20条数据
    let data = await model.find({ $or: [{ name: uname }, { all: { $in: ['', uname] } }] }).sort({ update_at: -1 }).limit(20);
    let outData = []
    for (let { name: uname, msg } of data) {
      let tmp = `<div><span onclick="clickme('${uname}')">【${uname}】说</span>：${msg}</div>`
      outData.unshift(tmp)
    }
    // 发送之前的数据
    socket.emit('allmsg', outData);
  });


  // 接受聊天消息
  socket.on('msg', async msg => {
    let arr = msg.match(/^@(.+)\s+/)
    // @名称   认为是私聊
    if (!arr) {
      if(msg.includes('/uploads/')){
        msg = `<img src="${msg}" style="width:100px;" />`
      }
      // 在发送数据之前进行数据入库操作
      let ret = await model.create({
        name: uname,
        msg,
        all: ''
      });
      // 广播出去
      io.emit('msg', `<span onclick="clickme('${uname}')">【${uname}】说</span>：${msg}`)
    } else {
      msg = msg.replace(/^@(.+)\s+/, '')

      let ret = await model.create({
        name: uname,
        msg,
        all: arr[1]
      });

      // 私聊
      socket.emit('msg', `【${uname}】说：${msg}`)
      onlineUser[md5(arr[1])].emit('msg', `【${uname}】说：${msg}`)
    }

    // 广播出去
    // io.emit('msg', `【${uname}】说：${msg}`)
    // 广播出去 除了不给自己发，给其他人发
    // socket.broadcast.emit('msg', `【${uname}】说：${msg}`)
  })

  socket.on('disconnect', () => {
    delete onlineUser[md5(uname)]
    // 除了不给自己发，给其他人发
    // socket.broadcast.emit('msg', `<span style='color:red'>系统说：【${uname}】默默退出了群聊</span>`)
  })

})



